package modelo.test;

import java.util.Collection;
import java.util.Iterator;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import modelo.enemigos.CreadorEnemigo;
import modelo.enemigos.CreadorHormiga;
import modelo.enemigos.CreadorMosca;
import modelo.enemigos.Enemigo;
import modelo.enemigos.ManejadorEnemigos;
import modelo.juego.Configuracion;
import modelo.juego.Jugador;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;

public class PruebaManejadorEnemigos extends TestCase {

	private Mapa m = new Mapa(Configuracion.TAMANIO_MAPA);
	private Jugador j = new Jugador();
	private ManejadorEnemigos me;

	public void testManejadorEnemigos() {
		CreadorEnemigo cEnemigo = new CreadorHormiga();
		me = new ManejadorEnemigos(m, j, 15, cEnemigo);

		assertNotNull(me);
	}

	public void testLatir() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		CreadorEnemigo ce = new CreadorMosca();
		me = new ManejadorEnemigos(m, j, 5, ce);
		Collection<Enemigo> enemigosCreados;
		Iterator<Enemigo> enemigos;
		Casillero posicion;
		Casillero segundoCasillero;

		// Verifico q al crear el manager, no haya enemigos en el mapa.
		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		assertTrue(enemigosCreados.isEmpty());

		// Verifico q no se creen enemigos durante el periodo de gracia, ni
		// hasta q se cumpla el intervalo de creacion de enemigos
		for (int i = 0; i < Configuracion.PERIODO_DE_GRACIA + 4; i++) {
			me.latir();
		}
		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		assertTrue(enemigosCreados.isEmpty());

		// Con un latido mas, se debe crear un enemigo; lo verifico.
		me.latir();
		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		assertFalse(enemigosCreados.isEmpty());
		assertSame(enemigosCreados.size(), 1);

		// Verifico q el enemigo recien creado este en la primer posicion.
		enemigos = enemigosCreados.iterator();
		posicion = (enemigos.next()).getCasillero();
		assertSame(posicion, m.primeraPosicion());

		// En 2 latidos mas, la mosca deberia avanzar un casillero; lo verifico.
		me.latir();
		me.latir();
		me.latir();
		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		enemigos = enemigosCreados.iterator();
		posicion = (enemigos.next()).getCasillero();
		segundoCasillero = m.proximaPosicionDeCamino(m.primeraPosicion());
		assertSame(posicion, segundoCasillero);

		// En el latido 20, se deberia crear un segundo enemigo; lo verifico.
		me.latir();
		me.latir();
		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		assertSame(enemigosCreados.size(), 2);
	}

	public void testDaniar() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		CreadorEnemigo ce = new CreadorMosca();
		me = new ManejadorEnemigos(m, j, 5, ce);
		Collection<Enemigo> enemigosCreados;
		Iterator<Enemigo> enemigos;
		Enemigo unEnemigo;

		// Doy tiempo para q se cree UN enemigo
		for (int i = 0; i < Configuracion.PERIODO_DE_GRACIA + 5; i++) {
			me.latir();
		}
		// Verifico q se haya creado UN enemigo.
		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		assertSame(enemigosCreados.size(), 1);

		// Mato al enemigo recien creado y verifico q desaparezca del mapa.
		enemigos = enemigosCreados.iterator();
		unEnemigo = enemigos.next();
		me.Daniar(unEnemigo, 99);

		enemigosCreados = m.enemigosEnRango(m.primeraPosicion(), 10);
		assertTrue(enemigosCreados.isEmpty());

	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTestSuite(PruebaManejadorEnemigos.class);
		return suite;
	}
}
